/*--------------------------  ccay ajax 操作----------------------------------*/
// Create
Ccay.doPost = function(url, data, sucessCallback, failCallback, fnBeforSend,autoLoading) {
	Ccay.Core._ajax("POST", url, data, sucessCallback, failCallback,
			fnBeforSend, autoLoading);
};

Ccay.doGet = function(url, data, sucessCallback, failCallback, fnBeforSend,autoLoading) {
	Ccay.Core._ajax("GET", url, data, sucessCallback, failCallback,
			fnBeforSend, autoLoading);
};

Ccay.doDelete = function(url, data, sucessCallback, failCallback, fnBeforSend,autoLoading) {
	Ccay.Core._ajax("DELETE", url, data, sucessCallback, failCallback,fnBeforSend, autoLoading);
};

// Update
Ccay.doPut = function(url, data, sucessCallback, failCallback, fnBeforSend,autoLoading) {
	Ccay.Core._ajax("PUT", url, data, sucessCallback, failCallback,fnBeforSend, autoLoading);
};
// 别名
Ccay.doCreate = Ccay.doPost;
Ccay.doUpdate = Ccay.doPut;
Ccay.Page._beforeForward = function() {
	$.dialogClose();
	//$.ligerui.managers = {};
	Ccay.UI.loading();
}
Ccay.Page._afterForward = function() {
	Ccay.UI.loadingClose();
}

/**
 * Ccay.Common 公共类库
 */
Ccay.Common = {};

/** *********************** 页面操作 *************************** */
/**
 * @description form对象填充
 * @param [JQDom]
 *            form 目标对象或对象JQID
 * @param [String]
 *            url 请求的地址
 * @param [Fuction]
 *            fnSucess
 *            数据填充后执行的方法，执行fnSucess(datas,panel)，datas：[Json],返回的数据；panel：[JQDom],form对象
 * @param [Object]
 *            param 传递的参数
 * @param [Boolean]
 *            isPost 是否是Post方式，系统默认为Get方式
 * @param [Fuction]
 *            fnError 请求失败执行的方法
 */
Ccay.Common.formFill = function(form, url, fnSucess, isPost, param, fnError,fnBeforSend) {
	Ccay.Core._ajax(isPost ? "POST" : "GET", url, param, function(datas) {
				var panel = $(form);
				panel.jsonData(datas);
				fnSucess && fnSucess(datas, panel);
			}, fnError,fnBeforSend);
}

/**
 * @description 保存方法
 * @param [Boolean]
 *            iscreate 是否是新增
 * @param [String]
 *            url 请求的地址
 * @param [Object]
 *            param 传递的参数
 * @param [Fuction]
 *            fnSucess 数据填充后执行的方法，执行fnsucess(datas)，datas：[Json],返回的数据
 * @param [Fuction]
 *            fnError 请求失败执行的方法
 */
Ccay.Common.save = function(isCreate, url, param, fnSucess, fnError,form) {
	Ccay.Core.setActiveForm(form);
	Ccay.Core._ajax(isCreate ? "POST" : "PUT", url, param, fnSucess, fnError);
}

/**
 * @description form保存方法
 * @param [Boolean]
 *            iscreate 是否是新增
 * @param [String]
 *            url 请求的地址
 * @param [Object]
 *            param 传递的参数
 * @param [Fuction]
 *            fnSucess 数据填充后执行的方法，执行fnsucess(datas)，datas：[Json],返回的数据
 * @param [Fuction]
 *            fnError 请求失败执行的方法
 */
Ccay.Common.formSave = function(form, url, isCreate, fnSucess, fnError) {
	var form = $(form);
	if (form.valid())
		Ccay.Common.save(isCreate, url, form.jsonData(), fnSucess, fnError,form);
}

/**
 * @description grid批量删除方法
 * @param [JQDom]
 *            grid 目标对象或对象JQID
 * @param [String]
 *            url 请求的地址
 * @param [Object] 
 * 			  msg：
 *            confirm 确认是否删除的信息
 *            noSelected 未选中的信息
 * @param [Fuction]
 *            fnConfirm
 *            重写confirm后方法，执行fnconfirm(result),result:[Boolean],confrim结果
 * @param [Fuction]
 *            fnSucess 数据填充后执行的方法，执行fnsucess(datas)，datas：[Json],返回的数据
 * @param [Fuction]
 *            fnError 请求失败执行的方法
 */
Ccay.Common.gridDel = function(grid, url, fnConfirm, fnSucess, fnError, msg) {
	var records = $(grid).getCcayGridManager().getSelectedRecords();

	if (records.length > 0) {
		Ccay.UI.confirm((msg && msg.confirm) ? msg.confirm  : "ccay.common.message.confdel", fnConfirm
						|| function(result) {
							if (result)
								Ccay.doPut(url, records, function() {
											// 删除后调用刷新grid数据接口
											fnSucess ? fnSucess() : $(grid).getCcayGridManager().search(1);
										}, fnError);
						});
	} else
		Ccay.UI.showMessage((msg && msg.noSelected) ? msg.noSelected : "ccay.common.message.selectedRecords", "warn");

}
/**
 * @description 删除方法
 * @param [String]
 *            url 请求的地址
 * @param [Object]
 *            param 传递的参数
 * @param [Object] 
 * 			  msg：
 *            confirm 确认是否删除的信息
 *            noSelected 未选中的信息
 * @param [Fuction]
 *            fnConfirm
 *            重写confirm后方法，执行fnconfirm(result),result:[Boolean],confrim结果
 * @param [Fuction]
 *            fnSucess 数据填充后执行的方法，执行fnsucess(datas)，datas：[Json],返回的数据
 * @param [Fuction]
 *            fnError 请求失败执行的方法
 */
Ccay.Common.del = function(url, param, fnConfirm, fnSucess, fnError, msg) {
	Ccay.UI.confirm((msg && msg.confirm) ? msg.confirm : "ccay.common.message.confdel", fnConfirm
					|| function(result) {
						if (result) {
							if (!param
									|| (param !== "object" && Ccay.DataHelper.isEmpty(param)))
								Ccay.UI.showMessage((msg && msg.noSelected) ? msg.noSelected : "ccay.common.message.selectedRecords","warn");
							else
								Ccay.doPut(url, param, function() {
											fnSucess && fnSucess();
										}, fnError);
						}
					});
}
/**
 * @description 打开页面窗口，modelwin和tab两种方式
 * @param [String]
 *            title 窗体标题
 * @param [String]
 *            url 页面地址
 * @param [Object]
 *            options 设置参数
 * @param [Fuction]
 *            fnCallback 打开窗口后执行的方法
 */
Ccay.Common.openPage = function(title, url, options, fnCallback) {
	if (!options)
		options = {};
	if (options.tab) { // 是否已tab方式打开
		var tabctr = $(options.tab);
		if (tabctr.length > 0) {
			options.title = title;
			options.url = url ;
			!options.permitsMany && (options.tabId = (options.tabIndex || options.tabid || options.tabId || "_addtabitem_default") );
			options.fnAfterAddItem = fnCallback ;
			tabctr.getCcayTabManager().addItem(options);
		} else
			Ccay.Core.log("没有Tab[{0}]对象！".formatValue(options.tab));
	} else {
		Ccay.UI.dialog(url, title, $.extend({
					width : options.width || 550,
					height : options.height || 400,
					//add 2014.2.10 yanmingkun 00230116 添加reSizable参数 支持最大化
					reSizable:options.reSizable || false,
					callback : fnCallback,
					fnBeforeClose:options.fnBeforeClose,
					//add 2014.1.1  hufeng 00214522 增加按钮位置传递
					btnAlign :options.btnAlign||Ccay.UI.Config.dialog.btnAlign,
					//end add
					/*
					 * defaultButtonClick:function(close){ options.defaultClick &&
					 * options.defaultClick(); close(); }
					 */
					buttons : options.buttons
				},options.dialogOp));
	}
}

/**
 * @description 绑定trigger对象的click，使目标对象隐藏/显示。
 * @param [Dom]
 *            trigger 目标对象或对象JQID
 * @param [string]
 *            targetid 目标对象ID
 * @param [string]
 *            css 可选,根据显示隐藏切换的样式,默认为'expend'
 * @param [function]
 *            fnToggle 可选,执行fnToggle(isExpend),isExpend:boolean，是否为展开状态
 * @returns trigger对象
 */
Ccay.Common.toggle = function(trigger, targetID, css, fnToggle) {
	var target = $(targetID).toggle();
	var triggerCtr = $(trigger).toggleClass(css || 'expend');
	if (fnToggle)
		fnToggle(!target.css('display') == 'none');
};

Ccay.Common.toggleScreen = function(isLocal) {
	var body = $(document.body).toggleClass('fullScreen');
	var wideScreen=0;
	//解决chrome浏览器普宽屏切换时出现变形 by twx305111 2015.8.21
	$('#bodyfixed #leftMenuContent').css('position','relative');
	if(body.hasClass('fullScreen')){
		wideScreen=1;
		$('#W3AppTop_Header').width("98%");
		$("#fullScreen_a").text($i18n("ccay.home.label.screen"));
	}else{
		$('#W3AppTop_Header').width("980px");
		$("#fullScreen_a").text($i18n("ccay.home.label.fullscreen"));
	}
	$('#bodyfixed #leftMenuContent').css('position','fixed');
	Ccay.UI.TopMenu && Ccay.UI.TopMenu.helper.buildTopMenu();  //菜单置顶,重新构建菜单
	Ccay.UI.TopItem && Ccay.UI.TopItem.helper.buildTopItem();  //菜单置顶 (支持三级),重新构建菜单
	// 执行所有的resize
	Ccay.UI.Resizes.fire("toggleScreen");
	!isLocal && Ccay.Personalized && Ccay.Personalized.save({common : {wideScreen : wideScreen, theme:Ccay.Personalized.global.common.theme || ""}},true,"",false);
};

/** *@description 工作区窗口最大化/恢复 */
Ccay.Common.fullScreen = function(){
	var current = $('#resizeWorkSpace');
	if (current.hasClass("big-maximize")){
		//按钮自身处理
		current.attr("title", $i18n("ccay.common.widget.normal"));
		current.addClass("small-maximize");
		current.removeClass("big-maximize");
		//页头、页尾处理
		$("#head_div").hide();
		$("#foot_div").hide();
		//菜单处理
		if(!$("#menuHideNarrow").hasClass('narrow')){
			$("#midPanel").trigger("click");
		}
		//宽屛处理
		current.data("wideScreen", $(document.body).hasClass('fullScreen'));
		if (!current.data("wideScreen")){
			Ccay.Common.toggleScreen(true);
	    }
	}else{
		$("#head_div").show();
		$("#foot_div").show();
		if (!current.data("wideScreen")){
			Ccay.Common.toggleScreen(true);
		}
		if($("#menuHideNarrow").hasClass('narrow')){
		    $("#midPanel").trigger("click");
		}
		current.attr("title", $i18n("ccay.common.widget.maximize"));
		current.addClass("big-maximize");
		current.removeClass("small-maximize");
	}
};

/** *@description JQ扩展操作封装 */
(function($) {

	/**
	 *@param {jqDom} elmt  当前提取元素
	 *@param {jqDom} container  面板容器
	 */
	_jsonDataGetValue=function(elmt,container,currObj,lastAttr){
	    var format=elmt.attr("format"),type=elmt.attr("type"),value=elmt.val();
	    if(type=="radio"){
	        return elmt[0].checked ? value : (elmt.attr("uncheckvalue")|| "");
	    }else if(type=="checkbox"){
	    	var checked=elmt.attr("checked"),isArray=elmt.attr("isArray"),split=elmt.attr("splitChar")|| ",";
	        if(currObj  && checked){
	        	currObj[lastAttr] = currObj[lastAttr] || (isArray? [] : "");
	        	if(typeof currObj[lastAttr]=="string"){
	        		currObj[lastAttr] += currObj[lastAttr] ? split + value : value;
	        	}else{
	        		currObj[lastAttr].push(value);
	        	}
	        }else{
	        	  return checked ? value : (elmt.attr("uncheckvalue") || "");
	        }
	    }else if (format && value && !elmt.attr("timezoneop")) {
			//日期类型数据处理
	    	if(!elmt.attr("convertDate") && (elmt.attr("showDate")=="false" || elmt.attr("datatype") == "string")){
	    		return value;
	    	}
			var format = (format=="date" || format=="datetime" || format == "datehm") ? null : format;
			return value.toDate(format);
		}else {
			return elmt.ccayGetValue();
		}
	}
	/**
	 *@param {jqDom} elmt  当前填充元素
	 *@param {String} value   填充值
	 */
	_jsonDataSetValue=function(elmt,value){
	    var tagName=elmt[0].tagName,type=elmt[0].type;
	    if(type=="radio"){
	        if(value==elmt[0].value){
	        	elmt.attr("checked","checked");
	        }else{
	        	if(elmt[0].checked)
	        		elmt.removeAttr("checked");
	        }
	    }else if(type=="checkbox"){
	    	var splitChar = elmt.attr("splitChar") || ",";
			var isArray=elmt.attr("isArray");
			if(value!==null && value!==""){
				var values = isArray ? value : (""+value).split(splitChar);
				for (var i=0; i < values.length; i++) {
	                 if(values[i]==elmt[0].value){
	                     elmt[0].checked=true;
	                     return;
	                 }
				};
	            elmt.removeAttr("checked");
			}else{
				elmt.removeAttr("checked");
			}
	    } else if (tagName == "LABEL") {
			var fmt = elmt.attr("format");
			if (fmt &&  value!==null){
				value = Ccay.Format.toDate(value).format(Ccay.Config.Format[fmt] || fmt);
			}
			if(elmt.hasClass("manytext")){
				elmt.html((""+value).replace(/&/g,"&#38;").replace(/</g,"&lt;").replace(/\x0d|\x0a/g,"<br>"));
			}else{
				elmt.text(value===null ? "":value);
			}
			
		} else {
			if(value || value===0){
				var fmt = elmt.attr("format");
				if (fmt) {
					fmt = Ccay.Config.Format[fmt] || fmt;
					value =Ccay.Format.toDate(value,fmt).format(fmt);
				}
				elmt.ccaySetValue(value);
			}else{
				elmt.ccaySetValue("");
			}
		}
	}
	/**
	 * 拿到本dom容器中的所有输入元素(:input)的value，根据元素name 生产一个json格式的数据集对象返回。
	 * 或将一个json格式的数据对象填充或绑定的本dom容器form元素中 
	 * @param {Object} data 需要填充或绑定到本dom容器元素中 的数据
	 */
	$.fn.jsonData=function(data){
	    //声明将要用到的变量
	    var elmtName,elmtValue,elmt,curFormat,isStringType,currValue,elmts= data && data.prototype && data._elements || this.find(":input[name]").toArray(),
	    i = 0, length;
	
	    //判断是否传递了用于填充的数据对象
	    if(data && typeof data=="object"){
	        //如果传递了 data参数，则将data中的数据绑定到容器中的form元素中
	        elmts=elmts.concat(this.find("label[name]").toArray());
	        length = elmts.length;
	        for(;i < length; i++){
	            elmt=$(elmts[i]);
	            elmtName=elmt.attr("name");
	            //根据elmtName取出data中相对应得数据
	            elmtValue=void 0;
	            try{elmtValue=eval("data."+elmtName);}catch(e){}
	            if(typeof elmtValue!="undefined"){
	            	
	            	if(elmt.hasClass("ccay-calendar") && elmtValue){
	            		
	            		//得到 format
	            		curFormat = elmt.attr("format");
	    				curFormat = (curFormat =="date" || curFormat =="datetime" || curFormat == "datehm") ? null : curFormat ;
	    				//值类型，确定转换时区之后是否需要转换类型
	            		isStringType = $.type( elmtValue ) == 'string';
	            		//时间时区转换 
	            		currValue = $.type(elmtValue) == "date" ? elmtValue : elmtValue.toDate();
	            		currValue && $.type(currValue) == "date" && (elmtValue = currValue.getUTCTime());
	            		//如果是转换之前为String 类型，则继续转换
	            		isStringType && ( elmtValue = elmtValue.toString()); 
	            	}
	            	if((elmt.is("textarea") && elmt.attr("textarea-maxlength") ) || elmt.attr("textarea-maxlength") == 0){
	            		var textarea_maxlength = elmt.attr("textarea-maxlength")*1 ,
	            			//elmtValue_lenght = elmtValue.toString().length ;
	            			elmtValue_lenght = elmtValue ? elmtValue.toString().length : 0;
	            		if(!isNaN(textarea_maxlength) && elmtValue_lenght){
	            			if(elmtValue_lenght > textarea_maxlength){
	            				elmtValue = elmtValue.toString().substring(0,textarea_maxlength);
	            			}
	            			elmt.next(".textarea-maxlength").find("span.only-count").text(textarea_maxlength - elmtValue.toString().length);
	            		}
	            	}
	                _jsonDataSetValue(elmt,elmtValue);
	            }
	        }
	      return this;
	    }else{
	        //如果没有任何参数，则需取出容器中的输入元素值，根据其name封装成对象返回
	        //用户缓存已经 设置或读取过的 name 属性，（相同name元素在同一次jsonData操作中的不会读取第二次）
	    	var fullObj={},currObj;
	    	length = elmts.length;
	    	if(typeof data == "function"){
	    		fullObj = data.fullObj || {};
	    		i = data.currIndex || 0;
	    	}
	      	
	        for(;i < length; i++){
	            elmt=$(elmts[i]);
	            elmtName=elmt.attr("name");
				elmtValue = _jsonDataGetValue(elmt,this);
				//当能取到值才去设置json数据
				if(!Ccay.DataHelper.isEmpty(elmtValue)){
	            	if(elmt.hasClass("ccay-calendar") && !elmt.attr("timezoneop")){
	            		//得到 format
	            		curFormat = elmt.attr("format");
	    				curFormat = (curFormat =="date" || curFormat =="datetime" || curFormat == "datehm") ? null : curFormat ;
	    				//值类型，确定转换时区之后是否需要转换类型
	            		isStringType = $.type( elmtValue ) == 'string';
	            		//事件时区转换 
            			currValue = $.type(elmtValue) == "date" ? elmtValue : elmtValue.toDate();
	            		currValue && $.type(currValue) == "date" && (elmtValue = currValue.getUTCTime(8,Ccay.Personalized.global.common.timeZone));
	            		//如果是转换之前为String 类型，则继续转换
	            		isStringType && ( elmtValue = elmtValue.format( curFormat )); 
	            	}
	            	
		            currObj=fullObj;
		            var attrs=elmtName.match(/[a-zA-Z0-9_]+/g);
		            if(!attrs)
		            	continue;
		            for (var j=0; j < attrs.length-1; j++) {
		                if(typeof currObj[attrs[j]]!="object"){
		                	//如果下一个属性是数字，则将当前对象声明为数组，否则声明为普通对象
		                    currObj=currObj[attrs[j]]= isNaN(attrs[j+1]) ? {} :[];
		                }else{
		                	currObj=currObj[attrs[j]];
		                }
		            };
		            var lastAttr=attrs[attrs.length-1];
		            if(!isNaN(lastAttr)){
		                lastAttr=lastAttr*1;
		            }
		            
		            if(elmt[0].type == "checkbox" && !elmt.attr("uncheckvalue")){
		            	_jsonDataGetValue(elmt,this,currObj,lastAttr);
		            }else{
		            	currObj[lastAttr] = elmtValue;
		            }
				}
				if(i && i % 100 == 0 && i + 1 < elmts.length &&  typeof data == "function" ){
	    			setTimeout(function(){
	    				 var fullData = $([]).jsonData( $.extend(data,{fullObj : fullObj, currIndex : i + 1, _elements : elmts }) );
	    				 if(fullData){
	    				 	data(fullData);
	    				 }
	    			},0); 
	    			return 
				}
	        }
	        return fullObj;
	    }
	}

	/**
	 * @description 在form下根据name查询对象。
	 * @param [string]
	 *            name 查询对象的name属性
	 * @returns [JQDom] 查询的对象
	 */
	$.fn.nameChild = function(name) {
		return this.find("[name='" + name + "']");
	}

	/**
	 * @description 在form下根据name给对象赋值。
	 * @param [string]
	 *            name 查询对象的name属性
	 * @param [string]
	 *            value 值
	 * @returns [JQDom] 查询的对象
	 */
	$.fn.formSetValue = function(name, value) {
		return this.nameChild(name).val(value);
	}
})(jQuery)

/**
 * 验证控件扩展
 */
Ccay.Common.initValidate = function() {
	// 临时验证器接口添加，跳转清除缓存的时候，会清空临时验证器
	$.validator.addTempMethod = function(name, method, message){
		var methods = $.validator.tempMethods;
		!methods && (methods = $.validator.tempMethods = []);
		methods.push(name);
		$.validator.addMethod(name, method, message);
	};
	
	$.validator.clearTempMethods=function(){
		//如果存在临时验证器记录，则遍历，并清除
		if(this.tempMethods){
			for(var i=0,name;name=this.tempMethods[i];i++){
				$.validator.removeRule(name);
			}
			//清空临时验证器记录
			this.tempMethods=null;
		}
	};
	
	$.validator.addMethod("max-gap", function(value, element) {
		var maxGap = element.attr("maxGap"),
			compareTo = element.attr("compareTo"),
			compareTo_time = $(compareTo).ccayGetValue(),
			bool = true;
		if(element.attr("maxGap") && !isNaN(maxGap) && compareTo){
		 	if(compareTo_time){
		 		var maxdate = compareTo_time.toDate().addMonth(maxGap*1);
		 		if(element.ccayGetValue()){
		 			var element_value =  element.ccayGetValue().toDate();
		 		    bool = element_value - maxdate == 0 ? true : element_value < maxdate ;
		 		}
		 	}else {bool = false;}
		}
		return bool;
	});
	
	$.validator.addMethod("dateCompare", function(value, element) {
		var params =arguments[2];
		var invalid = true; 
		try{
			var control=$(element);
			if(params && params.length > 2){
				//igrid，时间比较验证
				var compareVal = ($(params[2]).manager().getEditRow($(element)).children('[field="'+ params[0] + '"]')).text().replace(/\s/g, " ");
				var currentDate = Ccay.Format.toDate(value);
					if(compareVal){
						var compareDate = Ccay.Format.toDate(compareVal);
						if (params[1]===0) {
							return currentDate <= compareDate;
						} else if (params[1]) {
							return currentDate >= compareDate;
						}
					}else{
						return true;
					}
			}else{
				//普通表单上，时间比较验证
				var compareInput = $(control.attr("compareTo") || params[0]);
				var type = control.attr("format") || "date";
				if (value === null || value === "" || compareInput.length==0) {
					invalid = true;
				}else{
					if(!compareInput.hasClass("dateCompareB") && control.prop("id")){
						compareInput.attr("compareTo","#"+control.prop("id"))
						compareInput.addClass("dateCompareB");
					}
					var compareVal= compareInput.val();
					if (compareVal && compareVal.toDate()){
						compareInput.removeClass("error-ctr error"); 
						return  value.toDate()>= compareVal.toDate() ? true :false;
					}
				}
				return invalid
			}
		}
		catch(e){
			return true;
		}
	});
	$.validator.addMethod("dateCompareB", function(value, element) {
		var control=$(element);
		try{
			var compareInput = $(control.attr("compareTo"));
			var compareVal = compareInput.val();
			if (compareInput.length > 0 && value != "" && compareVal != ""){
				compareInput.valid(true);
			}
			return true;
		}
		catch(e){
			return true;
		}
	});
	
	$.validator.addMethod("speczh", function(value){
		if(value){
			var reg=new RegExp("[<>?!@#$%\\\\\\/]+");
			return !reg.test(value)
		}
		return true;
	});
	$.validator.addMethod("specialch", function(value){
		if(value){
			var reg=new RegExp("^[a-zA-Z0-9_.-]+$");
			return reg.test(value)
		}
		return true;
	});
	$.validator.addMethod("specialch2", function(value){
		if(value){
			var reg=new RegExp("^[a-zA-Z0-9_. +@&():?\-]+$");
			return reg.test(value)
		}
		return true;
	}); 
	
	$.validator.addMethod("filesize", function(value, data, param){
		if(value){
			if(/^\d+\.?\d*[BKMGT]?$/i.test(value)){
				var  max = param.maxsize || 999999999, min = param.minsize || 0
				unit =param.unit || "K", currUnit =value[value.search(/[BKMGT]/i)] || unit;
				value = Ccay.Format.toFileSize(parseFloat(value), unit, currUnit.toUpperCase()) || 0;
				return parseFloat(value) <= max * 1 &&  parseFloat(value) >= min * 1;
				
			}else{
				return false;
			}
		}
		return true;
	});
	$.validator.addMethod("sameValue", function(value,element){
		try{
			var grid = Ccay.UI.IGrid.Helper.getGridObj(element),selectValue = element.manager().getValue(),
				cellValue = element.data("caller").attr("val") || element.data("caller").text(), sameValues,name=element.attr("name");
			if (selectValue != cellValue) {
				sameValues = grid.op.Storage.filter(function(item, i){
					return (item[name] == selectValue) ? true : false;
				});
				return sameValues.length ? false : true;
			}
			return true;
		}catch(e){
			return true;
		}
	}); 
};

Ccay._fnInitAjax4Loading = function (){

	function closeLoading(type,ui,ajax) {
		if(ajax.loading !== false){
			if(ui){
				$(ui).loadingClose();
			}else{
				var notGet = type !== "GET" ;
				if( Ccay.Core_ajaxCount[ notGet ? "other" : "get"] <= 0){
					Ccay.UI.loadingClose( notGet );
				}
			}
		}
	}
	Ccay.Core._Delegates.ajax_before.add('loading', function(op,ui,ajax) {
		if (ajax.loading !== false){
			if(ui){
				$(ui).loading();
			}else{
				Ccay.UI.loading(op.type !== "GET");
			}
		}else{
			Ccay.autoLoading = true;
		}
	});
	Ccay.Core._Delegates.ajax_Sucess.add('loadingclose', closeLoading);
	Ccay.Core._Delegates.ajax_Error.add('loadingclose', closeLoading);
}


/** 判断浏览器版本，并在浏览器进行提示
 *   2012-10-16
 */
Ccay._fnCheckBrowser = function (){
		Ccay.Common.setBrowserVersion();
	    var checkBrowserflag = parseInt(workspaceVO.checkBrowser);
		//0表示不用检测浏览器类型，1表示检测浏览器类型并给出提示，2表示强制用户升级浏览器,3表示检测浏览器类型单不可关闭提示
	    var noCheck = 0 , checkWithTip = 1 , mustUpgrade = 2 , checkWithNoClose = 3;
	    if(checkBrowserflag == noCheck){
	       $('#browserVersionTip').remove();
	       return;
	    }
	    // 根据全局条件checkBrowser设置，若关闭每天提示，则一直检测提示，否则当天只提示一次
	    if(Ccay.Personalized.global.common && Ccay.Personalized.global.common.lastCheckBrowserDate != "0"){
	    	// 当天，不再检测提示
			if( Ccay.Core.getServerTime().format("yyyy-MM-dd") == Ccay.Personalized.global.common.lastCheckBrowserDate){
			   $('#browserVersionTip').remove();
			   return;
			}
	    };
		var s,browserType,browserVersion,
		    ua = navigator.userAgent.toLowerCase(),
			// 最低版本要求:IE9/Chrome28/safari5/Firefox22
		    browsers = [{rule: /(msie\s|trident.*rv:)([\d.]+)/,type:"ie",minVersion:9}, //兼容IE11
		    	       {rule: /(chrome)\/([\d.]+)/,type:"chrome",minVersion:28},
		    	       {rule: /version\/([\d.]+).*(safari)/,type:"safari",minVersion:5},
					   {rule: /(firefox)\/([\d.]+)/,type:"firefox",minVersion:22}];
		for(var i=0,browser; browser = browsers[i]; i++){
			if(s=ua.match(browser.rule)){
			  // 浏览器类型
			  browserType = browser.type;
			  // 浏览器版本号 safari版本号是在第二位
			  browserVersion = parseInt(i == 2 ? s[1] : s[2]);
			  // 限制的最低版本
			  s = browser.minVersion;
			  break;
			};
		};
		// 建议IE8以上、Chrome15以上，否则在状态栏信息提示,或者强制升级才能使用 ,
		// 其他浏览器也提示
		var htmlList = [];
		htmlList.push('<div style="width:100%;height:25px;line-height:25px;z-index:990;position:fixed;background-color:#FFFACD;">');
		htmlList.push('<span class="i18n" i18nKey="ccay.common.checkBrowser.tip" style="float:left;padding-left:10px;"></span>' );
		htmlList.push('<input type="button" id="closeBrowserBtn" class="i18n" onclick="Ccay.Common.closeCheckBrowser()" i18nKey="ccay.common.checkBrowser.tipBtn" />');
		htmlList.push('</div>');
		if ((browserType=="chrome" && browserVersion < s) || 
			/* IE8,9的兼容模式已在Ccay.Common.setBrowserVersion判断处理 */
		    (browserType=="ie" && $.browser.version < s ) ||
		    (browserType=="safari" && browserVersion < s) ||
		    (browserType=="firefox" && browserVersion < s)) {
		    	switch(checkBrowserflag){
		    		case checkWithTip : 
		    			 $("#browserVersionTip").attr("style","width:100%;height:25px;").append(htmlList.join(""));
		    		     break;
		    		case mustUpgrade :  
		    		     $(document.body).html($i18n("ccay.common.checkBrowser.tip")+
			    		 "<p><a href=\"#\" onclick=\"window.open('', '_self', '');window.top.close()\">Close Window</a>").css("font-size","15px");
			    		 break;
			        case checkWithNoClose : 
                         $("#browserVersionTip").attr("style","width:100%;height:25px;").append(htmlList.join(""));
                         $("#closeBrowserBtn").remove();
	                     break;
	            }
	    }else if( browserType != "chrome" && browserType != "ie" && browserType != "safari" && browserType != "firefox" ){
			  $("#browserVersionTip").attr("style","width:100%;height:25px;").append(htmlList.join(""));
	    }
};

/**@description 关闭"今天不再提示此消息 "事件
 * 
 */
Ccay.Common.closeCheckBrowser = function(){
	$('#browserVersionTip').remove();
	// 保存当前日期到个性化global.common.lastCheckBrowserDate
	Ccay.Personalized.global.common.lastCheckBrowserDate = Ccay.Core.getServerTime().format("yyyy-MM-dd");
	Ccay.Personalized.save(Ccay.Personalized.global, true, function(){});
};

/**@description IE浏览器版本赋值
 *  2013-5-22
 */
Ccay.Common.setBrowserVersion = function(){
	var browserVersion = $.browser.version,
		ua = navigator.userAgent.toLowerCase();
	// 只判断IE浏览器,处理兼容模式的浏览器版本
	if(ua.match(/msie ([\d.]+)/)){
		if(ua.indexOf("trident/5.0") > 0 ){
			browserVersion = "9";
		}else if(ua.indexOf("trident/4.0") > 0 ){
			browserVersion = "8";
		}
	};
 	$.browser.version = browserVersion;
};	

/**@获得igrid的筛选的url串
 * 
 * @since 2014-3-27
 * @param url {String} 含占位符${filtersStr}
 * @param gridSelector {String} grid的选择器
 */
Ccay.Common.getFiltersUrl = function(url, gridSelector){
	var gridMng = $(gridSelector).manager();
	//修复国际化导出查询模式下，导出数据与筛选条件不匹配问题。
	if(gridMng.op.showSwitch && gridMng.op.switchMode == "search"){
		return url.formatField({filtersStr: gridMng.op.pagerOp && gridMng.op.pagerOp.pageInf && gridMng.op.pagerOp.pageInf.filter || encodeURIComponent("[]")});
	}

	return url && gridMng.getFiltersStr ? url.formatField({filtersStr: gridMng.getFiltersStr()}) : "";
};
